home *** CD-ROM | disk | FTP | other *** search
/ TOS Silver 2000 / TOS Silver 2000.iso / programm / MM2_DEV / S / MOS / CONVERT.D < prev    next >
Encoding:
Modula Definition  |  1990-10-24  |  8.6 KB  |  215 lines

  1. DEFINITION MODULE Convert;
  2.  
  3. (*
  4.  * Grundmodul zur Umwandlung von CARDINAL/INTEGER/REAL-Werten in
  5.  * die Textdarstellung und umgekehrt.
  6.  *)
  7.  
  8. (*$H+  >> erlaubt auch lokale Prozeduren als 'GetProc' *)
  9.  
  10. FROM SYSTEM IMPORT ADDRESS, LONGWORD, WORD;
  11.  
  12.  
  13. TYPE GetInfo = RECORD
  14.                  ch     : CHAR;     (* Hier gehört das Zeichen hin *)
  15.                  userPtr: ADDRESS;  (* Für eigene Verwendung *)
  16.                END;
  17.      
  18.      GetProc = PROCEDURE ( VAR GetInfo );
  19.  
  20.  
  21. PROCEDURE ConvToLCard ( get: GetProc; VAR info: GetInfo;
  22.                         VAR valid : BOOLEAN ): LONGCARD;
  23.  
  24. PROCEDURE ConvToCard  ( get: GetProc; VAR info: GetInfo;
  25.                         VAR valid: BOOLEAN ): CARDINAL;
  26.  
  27. PROCEDURE ConvToLInt  ( get: GetProc; VAR info: GetInfo;
  28.                         VAR valid: BOOLEAN ): LONGINT;
  29.  
  30. PROCEDURE ConvToInt   ( get: GetProc; VAR info: GetInfo;
  31.                         VAR valid: BOOLEAN ): INTEGER;
  32.  
  33.   (*
  34.      'get' bestimmt eine Zeichenhol-Funktion, die jeweils ein Zeichen
  35.      in 'info.ch' ablegt. Wenn keine Zeichen mehr vorhanden sind, sollte
  36.      das Zeichen 0C darin abgelegt werden. 'info.userPtr' wird von den
  37.      'ConvTo...'-Funktionen nicht benötigt, sie kann zum Datenaustausch
  38.      zw. dem Aufrufer und der Funktion 'get' dienen. Das 'info'-Record
  39.      wird nicht verändert.
  40.      
  41.      Wenn 'valid' nach dem Aufruf FALSE ist, bedeutet das, daß der
  42.      erwartete Wert nicht ermittelt werden konnte.
  43.      
  44.      Für die vier ConvTo...-Funktionen gilt:
  45.      
  46.      - führende Blanks und TABs werden ignoriert, innerhalb der Zahl
  47.        dürfen dann keine Leerzeichen mehr vorkommen.
  48.      - ein eventuell vorangestelltes '+' wird ignoriert.
  49.      - Präfixe steuern die Interpretation der folgenden Zeichen:
  50.        '$' für Hexadezimal, '%' für Binär, kein Präfix bedeutet
  51.        dezimal.
  52.      - Bei ConvToInt bzw. ConvToLInt muß das '-' zuerst stehen, erst
  53.        dann darf der Präfix folgen
  54.        
  55.      Beispiele: ConvToCard ('  123 12') = 123
  56.                 ConvToLInt ('-$80') = -128L
  57.   *)
  58.  
  59.  
  60. PROCEDURE ConvToLNum (     get   : GetProc;
  61.                        VAR info  : GetInfo;
  62.                            base  : CARDINAL; (* [2..36] *)
  63.                        VAR valid : BOOLEAN ): LONGCARD;
  64.  
  65. PROCEDURE ConvToNum (    get   : GetProc;
  66.                      VAR info  : GetInfo;
  67.                          base  : CARDINAL; (* [2..36] *)
  68.                      VAR valid : BOOLEAN ): CARDINAL;
  69.   (*
  70.      Diese beiden Funktionen werten eine Zahl zur Basis 'base' aus.
  71.      Dabei muß 'base' zwischen einschließlich 2 und 36 liegen (sonst
  72.      liefert valid FALSE).
  73.      Die Ziffern 10 bis 36 müssen dabei durch die Buchstaben 'A' bis 'Z'
  74.      dargestellt sein. Die Buchstaben dürfen groß und klein sein.
  75.      Die Zahlen dürfen kein Vorzeichen und keinen Präfix ('$' oder '%')
  76.      haben.
  77.      Führende Blanks und TABs werden ignoriert.
  78.   *)
  79.  
  80. PROCEDURE ConvToReal ( get: GetProc; VAR info: GetInfo;
  81.                        VAR valid: BOOLEAN ): LONGREAL;
  82.  
  83.   (*
  84.     ConvToReal liefert den Wert einer reellen Zahl. Dabei darf entweder der
  85.     Nachkommateil (einschließlich '.') oder der Vorkommateil fehlen. Ebenfalls
  86.     braucht kein Exponent angegeben werden. Ein eventueller Skalierungsfaktor
  87.     wird durch ein vorangestelltes 'E' erkannt und darf im Bereich von -1232
  88.     bis +1232 liegen.
  89.     
  90.     Es gilt:
  91.     
  92.     - führende Blanks und TABs werden ignoriert, innerhalb der Zahl dürfen
  93.       dann keine Leerzeichen mehr vorkommen.
  94.     - ein eventuell vorangestelltes '+' wird ignoriert.
  95.     
  96.     z.B. : ConvToReal ('123E12') = 1.23 E14
  97.            ConvToReal ('.012E-23') = 1.2 E-25
  98.   *)
  99.  
  100.  
  101.  
  102. (* ======================================================================= *
  103.  * Es folgen Funktionen zur Umwandlung von Zahlen in Strings. Dabei gilt   *
  104.  * allgemein:                                                              *
  105.  * - 'spc' bestimmt die Mindestlänge des resultierenden Strings 'str'.     *
  106.  * - Wenn das Ergebnis (mit Berücksichtigung von 'spc' !) nicht in den     *
  107.  *   String paßt, tritt ein Laufzeitfehler ein ('string overflow').        *
  108.  * ======================================================================= *)
  109.  
  110.  
  111. PROCEDURE ConvCard ( v: LONGCARD; spc: CARDINAL; VAR str: ARRAY OF CHAR);
  112. PROCEDURE ConvInt  ( v: LONGINT;  spc: CARDINAL; VAR str: ARRAY OF CHAR);
  113.  
  114.   (*
  115.     Die Conv...-Funktionen wandeln eine Zahl in einen String um. Dabei steht
  116.     ein eventuelles Minuszeichen direkt vor der ersten Ziffer. Falls die Zahl
  117.     weniger Stellen (inklusive Vorzeichen) als in 'spc' angegeben haben sollte,
  118.     so werden entsprechend viele Leerzeichen vorangestellt.
  119.     Die Höchstlängen der Ergebnisse sind, sofern 'spc' nicht größer angegeben
  120.     wird: 5 bei 'CardToStr', 6 bei 'IntToStr', 10 bei 'LCardToStr', 11 bei
  121.     'LIntToStr'.
  122.     
  123.     z.B. : ConvCard (123,10) = '       123'
  124.            ConvInt (-2345,2) = '-2345'
  125.   *)
  126.  
  127. PROCEDURE ConvLHex ( v: LONGWORD; spc: CARDINAL; VAR str: ARRAY OF CHAR);
  128. PROCEDURE ConvHex  ( v: WORD;     spc: CARDINAL; VAR str: ARRAY OF CHAR);
  129. PROCEDURE ConvLBin ( v: LONGWORD; spc: CARDINAL; VAR str: ARRAY OF CHAR);
  130. PROCEDURE ConvBin  ( v: WORD;     spc: CARDINAL; VAR str: ARRAY OF CHAR);
  131.  
  132.   (*
  133.     Die Hex- und Bin-Funktionen erzeugen, wie der Name sagt, Strings in
  134.     hexadezimaler bzw. binärer Repräsentation. Es werden nur positive Zahlen
  135.     erzeugt. Zu Beachten ist, daß den Zahlen dabei ein '$' bzw. '%' vorange-
  136.     stellt wird und dieses Zeichen auch mit zur Mindestlängenangabe 'spc' zählt.
  137.     Ggf. ist das vorangestellte Zeichen mit der Funktion 'Strings.Delete' zu
  138.     entfernen. Führende Nullen werden nicht unterdrückt. Die Höchstlängen der
  139.     Ergebnisse sind, sofern 'spc' nicht größer angegeben wird: 5 bei 'HexToStr',
  140.     9 bei 'LHexToStr', 17 bei 'BinToStr', 33 bei 'LBinToStr'.
  141.     
  142.     z.B.: ConvHex (128,4)  = '$080'
  143.           ConvHex (128,0)  = '$80'
  144.           ConvLHex (-1L,0) = '$FFFFFFFF' (8 Ziffern)
  145.           ConvBin (100,9)  = '%01100100'
  146.           ConvLBin (-1L,1) = '%11111111111111111111111111111111' (32 Ziffern)
  147.   *)
  148.  
  149. PROCEDURE ConvLNum (    lnum : LONGWORD;
  150.                         base : CARDINAL; (* [2..36] *)
  151.                         space: CARDINAL;
  152.                         fill : CHAR;
  153.                     VAR str  : ARRAY OF CHAR);
  154.  
  155. PROCEDURE ConvNum  (    num  : WORD;
  156.                         base : CARDINAL; (* [2..36] *)
  157.                         space: CARDINAL;
  158.                         fill : CHAR;
  159.                     VAR str  : ARRAY OF CHAR);
  160.   (*
  161.      Diese beiden Funktionen erzeugen eine Zahl zur Basis 'base'.
  162.      Wenn 'base' < 2 oder > 36, dann tritt ein Laufzeitfehler auf
  163.      (Range Error).
  164.      'fill' bestimmt das Zeichen, mit dem vorn aufgefüllt wird, wenn
  165.      'space' größer als die eigentliche Zahl ist.
  166.   *)
  167.  
  168.  
  169. PROCEDURE ConvFloat ( v: LONGREAL; spc, n:CARDINAL; VAR str: ARRAY OF CHAR);
  170.  
  171.   (*
  172.     Durch diese Funktion wird die Zahl 'v' in wissenschaftlicher Notation dar-
  173.     gestellt. Es wird eine Vorkommastelle und 'n' Nachkommastellen, gefolgt von
  174.     'E', dem Vorzeichen des Skalierungsfaktors und dem vierstelligen Wert.
  175.     Ggf. wird der String links mit Leerzeichen bis zur Länge 'spc' aufgefüllt.
  176.     
  177.     z.B. : RealFloatToStr (0.0123,12,1) = '   1.2E-0002'
  178.            RealFloatToStr (9.9,0,10) = '9.9000000000E+0000'
  179.   *)
  180.  
  181. PROCEDURE ConvFix ( v: LONGREAL; spc, n:CARDINAL; VAR str: ARRAY OF CHAR);
  182.  
  183.   (*
  184.     Diese Funktion stellt 'v' in Festpunktnotation dar, wobei entsprechend viele
  185.     Vorkommastellen, jedoch nur genau 'n' Nachkommastellen gebracht werden.
  186.     Wenn der String kürzer als 'spc' sein sollte, so werden entsprechend viele
  187.     Leerzeichen vorangestellt.
  188.     
  189.     z.B. : RealFixToStr (0.0123,12,1) = '         0.0'
  190.            RealFixToStr (9.9,0,10) = '9.9000000000'
  191.   *)
  192.  
  193. PROCEDURE ConvReal ( v: LONGREAL; spc, n: CARDINAL; VAR str: ARRAY OF CHAR);
  194.  
  195.   (*
  196.     Diese Prozedur verwendet je nach Lage des Wertes 'v' innerhalb der Werte von
  197.     FixToFloatMin und FixToFloatMax das Festkomma- oder Fließkomma-Format zur
  198.     Darstellung von 'v'.
  199.   *)
  200.   
  201. PROCEDURE ConvEng ( v: LONGREAL; spc, n:CARDINAL; VAR str: ARRAY OF CHAR);
  202.  
  203.   (*
  204.     Durch diese Funktion wird die Zahl 'v' in Ingenieur-Notation dargestellt.
  205.     Es werden bis zu drei Vorkommastellen und 'n' Nachkommastellen, gefolgt
  206.     von 'E', dem Vorzeichen des Skalierungsfaktors und dem vierstelligen Wert,
  207.     der immer ein Vielfaches von Drei ist. Ggf. wird der String links mit Leer-
  208.     zeichen bis zur Länge 'spc' aufgefüllt.
  209.     
  210.     z.B. : RealEngToStr (0.0123,12,1) = '  12.3E-0003'
  211.            RealEngToStr (9.9,0,10) = '9.9000000000E+0000'
  212.   *)
  213.  
  214. END Convert.
  215.